<?php
declare (strict_types = 1);

namespace app\index\controller;

use app\BaseController;
use think\facade\View;
use think\facade\Request;

class Index extends BaseController
{
    public function frm(){
        return View::fetch();
    }
    public function index()
    {
// [请求]
// Request::变量类型 方法('[变量名][/变量修饰符]'[, '默认值'][，'过滤方法'])
// param    获取当前请求的变量   pathinfo(/控制器/方法/参数名/参数值/参数名/参数值...) + POST + GET
// get      获取$._GET变量      url中的?方式传递的参数
// post     获取$_ POST变量     接收POST表单提交的参数
//----------------------------------------------------------------------------------------------------------------------
//变量名:接受变量的名字,默认不写接收当前请求类型全部参数。
//变量修饰符:对变量的强制类型转换: TP5版 本针对数组类型接参必须指明类型为数组TP6不在 强制要求:
//修饰符   作用
// s       强制转换为字符串类型[默认，强制转换为字符串类型时可以不
// d       强制转换为整型类型[/d]
// b       强制转换为布尔类型
// a       强制转换为数组类型[ 数组/a]
// f       强制转换为浮点类型
//----------------------------------------------------------------------------------------------------------------------
//默认值:当无法接到参数时或者没有传参时(接到的参数值为Nu1l时)，会自动使用默认值来当作参数的值;
//第一类: param (TP自定义的接参请求类型)只要参数没有赋值，那么就会使用默认值来赋值;
          //参数名存在时:传值时会接收到传递的值;没有传值时默认会得到[Null]
          //参数名不在时:默认会得到[NuLl]
//第二类: get/post (HTTP官方协议所规定的标准的请求类型)
          //掺数在传参列表不存在时才走默认值，否则参数存在即使不赋值也认为默认赋值一个食字符串;
          //参数名存在时:传值时会接收到传递的值;没有传值时默认会得到[空字符串]这这种方式不会使用默认值
          //参数名不在时:默认会得到[Null]
//----------------------------------------------------------------------------------------------------------------------
//过滤方法:实质运行了一个过滤函数(仅有一个参数的函数) (只要是函数就可以) (多个过滤函数使用逗号分割，从左向右依次执行)
//作用:避免XSS跨站脚本攻击以及SQL注入的攻击手段
        //①trim:去掉两端空格;
        //②htmlspecialchars:转义常见的五个特殊字符(& ' " < >) html special chars
        //& => &amp;  '=> ' " => &quot; < => &lt; > => &gt;
        //③strip_ tags:过滤掉(去除掉) HTML、PHP、 NULL 的标签;
        //④md5、strtolower、 strtoupper这种类 似的一个参数的函数也都可以使用，但不常用，具体情况具体分析;
//----------------------------------------------------------------------------------------------------------------------
        // 获取部分变量：指定接收部分变量、排除指定的部分变量；第二个参数为针对的请求方式（类型），不写是针对get+Post
        // Request::only(['id','name']);
        // Request::except(['id','name'], 'post');
//----------------------------------------------------------------------------------------------------------------------
        // 判断变量是否被赋值（被设置），一般在项目中没有什么使用价值
        // Request::has('id','get')
//----------------------------------------------------------------------------------------------------------------------
        // 助手函数（TP框架提供的一个福利）针对所有的类的调用，都封装了一个助手函数来对应；(建议在模版中使用)
        // 缺点：比原有类的方式调用执行效率稍低
        // 优点：不需要引入命名空间
        // Request  input
        // input('请求类型.变量名','默认值','过滤方法')
        // 判断变量是否被赋值（被设置）input('?hobby');
//======================================================================================================================
        echo "<pre>";
        print_r(Request::only(['hobby'],'post'));
        echo "</pre>";

        echo "<pre>";
        print_r(Request::except(['hobby'],'post'));
        echo "</pre>";

        echo "<pre>";
        print_r(input('post.hobbyD:\apps\Git\bin'));
        echo "</pre>";
        echo "<pre>";
        print_r(input('post.hobby'));
        echo "</pre>";

        var_dump(Request::has('username','post'));
        echo "<hr>";
//======================================================================================================================
        var_dump(Request::post('username','123'));
        echo "<br>";
        var_dump(Request::post('username','123','trim,htmlspecialchars'));
        echo "<br>";
        var_dump(Request::post('username','123','trim,strip_tags'));
        echo "<br>";
        var_dump(Request::post('username','123','trim,htmlspecialchars,strip_tags'));
        echo "<br>";
        var_dump(Request::post('username','123','md5,strtolower'));
        echo "<br>";
//======================================================================================================================
        echo Request::param('name');
        echo Request::param('age');
        echo Request::param('sex');

//        echo "<pre>";
//        print_r($_GET);
//        echo "</pre>";
//
//        echo "<pre>";
//        print_r(Request::param());
//        echo "</pre>";
//
//        echo "<pre>";
//        print_r(Request::post());
//        echo "</pre>";
//
//        $hobby=Request::post('hobby/a');
//        echo "<pre>";
//        print_r($hobby);
//        echo "</pre>";
//
//        $sex=Request::param('sex/b');
//        var_dump($sex);

        var_dump(Request::param('name','123'));
        echo "<br>";
        var_dump(Request::get('name','123'));
        echo "<br>";
        var_dump(Request::post('username','123'));
        echo "<br>";


        //[模板赋值]五种赋值和在模板输出的方法
        //1.赋值标量(字符串,整型,浮点,布尔类型 不可再分的数据类型=复合数据类型)到模板
        $str='<h1>苏轼</h1>';
        View::assign("str",$str);

        //2.赋值一维数组   两种在模板输出方式 []  .
        $arr1=['苏轼',25,'su',123,111];
        View::assign('arr1',$arr1);

        $arr2=['name'=>'苏轼','age'=>25,'sex'=>'男'];
        View::assign('person',$arr2);

        //3.赋值二维数组    两种在模板输出方式 []  .
        $arr=[
            ['name'=>'苏轼','age'=>25,'sex'=>'男','hao'=>'东坡居士'],
            ['name'=>'李白','age'=>26,'sex'=>'男','hao'=>'青莲剑仙'],
            ['name'=>'陶渊明','age'=>27,'sex'=>'男','hao'=>'五柳先生'],
        ];
        View::assign('persons',$arr);

        View::assign([
            'time'=>time(),
            'num'=>1,
            'name1'=>2,
            'a'=>3,
            'b'=>2,
        ]);
        //4.赋值到对象的模板(对象的属性可以承载数据) 两种在模板输出方式  ->  :
        $obj=new \stdClass();
        $obj->name='Tom';
        $obj->nikname='猫';
        View::assign('obj',$obj);

        //5.批量赋值 可以将第一维是关联数组的数组 采用批量复制的形式赋值到模板,键名为变量名,键值为变量值
        View::assign($arr2);


        //渲染模板
        //模板跟控制器的方法只是一个默认的对应关系,这个对应关系(规则)仅仅是为了找模板方便而设定的规则而已
        //按照模板对应关系的控制器不一定存在.
        //参数1:渲染的模板 默认不写就是该控制器的方法对应的模板
        //      模板表达式 [应用@][控制器/][方法] 从右到左可以一次省略
        //参数2:模板批量赋值
        //return View::fetch('index@user_type/show_msg');
        //return View::fetch('../app/index/view/1/1.html');
        //return View::fetch();
    }

    public function test()
    {
        echo Request::controller();
    }
}
